home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagd_f.zip / EGAVGA.SWG / 0130_Map Drawing.pas < prev    next >
Pascal/Delphi Source File  |  1994-08-25  |  5KB  |  155 lines

  1. (*
  2. I have *really* simple code I wrote for loading a 320x200x256 pcx if
  3. that'd do. I have other stuff that you could work with, but it's not
  4. mine and not finished.
  5.  
  6. CL/  Display a background .PCX (a map in this case), and allow for the
  7. CL/movement of foreground objects w/o affecting the background .PCX.
  8.  
  9. What you want to do is use virtual screens or page flipping, depending
  10. on the graphic mode. If you're in low res (really easy!) 320x200x256,
  11. you can easily use 64k virtual screens (just arrays of [0..199,0..319]
  12. for simplicity) and treat *them* like a screen. Then dump them to the
  13. real screen once all your updates are done.  For higher vid modes,
  14. virtual screens can get a *bit* more complex, 'specially for 16 color
  15. modes.
  16.  
  17. CL/Item_REc = rec
  18. CL/             name : string [30];
  19. CL/             amt : byte;
  20. CL/          end;
  21. CL/Item_Type = array[1..5] of Item_Rec;
  22.  
  23. CL/Map_Rec = Record
  24. CL/            Occupant : Byte; { Player=1, Nobody=0, etc }
  25. CL/            Items    : Item_type;
  26. CL/            Case Terrain:Char of
  27. CL/              'F' : etc,etc...
  28. CL/         End; { Map_rec }
  29. CL/map_type = array[1..100,1..100] of map_rec;
  30.  
  31. CL/var
  32. CL/  Map : map_type;
  33.  
  34. Well, the list of items should be link listed. I mean, not *every* map
  35. will always have 5 items, right? Save memory that way.  Also, use
  36. item numbers instead of signifying an item by it's entire name.  Using
  37. a record structure something like this might help a bit:
  38. *)
  39.  
  40. Type
  41.   PItemRec = ^ItemRec;
  42.   ItemRec = record
  43.     name  : string[28];
  44.     idnum : word;
  45.     next  : PItemRec;
  46.   end; {ItemRec 35 bytes}
  47.  
  48.   PItemIdx = ^ItemIdx;
  49.   ItemIdx = record
  50.      idnum : word;      {maximum of ~65535 items, depending on mem}
  51.      amt   : Byte;
  52.      next  : PItemIdx;
  53.    end; {ItemIdx 7 bytes }
  54.  
  55.   PPlayerIdx = ^PlayerIdx
  56.   PlayerIdx = record
  57.     idnum : word;
  58.     next : PPlayerIdx
  59.   end; {PlayerIdx 6 bytes} {This will allow for more than one player
  60.                             on a map coord if you want. Just an idea}
  61.  
  62.   Map_Rec = Record
  63.     Occupants : PPlayerIdx;  {list of players}
  64.     Items     : PItemIdx;    {list of items}
  65.     Case Terrain:char etc
  66.   End; { Map_rec 9 bytes}
  67.  
  68. {If you only want one player per square at a time, you can change
  69. occupants to type byte, makeing map_rec 6 bytes, increasing your maximum
  70. map size by like 1/3
  71.  
  72. Again, you could do linked lists for the map, but I'm sure you won't
  73. have *that* big a map...  85x85 should be ok, right?
  74. }
  75.  
  76.   pmap_type = ^Map_Type;  {This will save your data segment some room}
  77.   map_type = array[1..85,1..85] of map_rec;   {with 9 byte maprec}
  78.   map_type = array[1..104,1..104] of map_rec; {with 6 byte maprec}
  79.  
  80. {here's some examples of how to access these variables}
  81.  
  82. Procedure AddItem(NewName:string;NewId:Word;Var List:PItemIdx);
  83. var
  84.   NewItem:PItemRec;
  85. begin
  86.   New(Newitem);       {alloc mem for new item}
  87.   with newitem^ do
  88.     begin
  89.       name:=newname;
  90.       Idnum:=newid;
  91.       Next:=List;     {chain "list" after newitem}
  92.     end;
  93.   List:=NewItem;      {Insert into front of list}
  94. end;
  95.  
  96. Var
  97.   Map      : PMap_Type;
  98.   ItemList : PItemRec;
  99.   t,i      : integer;
  100.   pPlr     : PPlayerIdx;
  101.   pItm     : PItemIdx;
  102.  
  103. begin
  104.   new(map);      { get heap memory for the MAP pointer}
  105.   ItemList:=nil;    { no items in master list yet}
  106.  
  107.   fillchar(map^,sizeof(map^),0);  { clear *ALL* map memory to zeros }
  108.  
  109.   {Make some arbitary items}
  110.   Additem('Sword',0,ItemList);
  111.   Additem('Shield',1,ItemList);
  112.   Additem('Dagger',2,ItemList);
  113.   Additem('Helm',3,ItemList);
  114.  
  115.   For T:=1 to 85 do
  116.     for I:=1 to 85 do
  117.       begin
  118.         terrain:=terraintypes[random(10)]; {whatever}
  119.         if random(100) then
  120.           begin
  121.             new(pitm); {make a new item idex}
  122.             with pitm^ do
  123.               begin
  124.                 idnum:=random(4);
  125.                 amt:=1;
  126.                 next:=nil;
  127.               end;
  128.             Map^[t,i].items^:=pitm;
  129.           end;
  130.       end;
  131.  
  132. {these next lines should clean up the entire map, no matter how many
  133. items, players or whatever you have around.  As long as you don't have
  134. any invalid pointers...<G>}
  135.  
  136.   For T:=1 to 85 do
  137.     for I:=1 to 85 do
  138.       begin
  139.         while occupant<>nil do
  140.           begin
  141.             pplr:=occupant;
  142.             occupant:=occupant^.next;
  143.             dispose(pplr);
  144.           end;
  145.         while items<>nil do
  146.           begin
  147.             pitm:=items;
  148.             items:=items^.next;
  149.             dispose(pitm);
  150.           end;
  151.       end;
  152.   dispose(map);  { free heap memory for the MAP pointer}
  153. end.
  154.  
  155.